﻿// ----------------------------------------------------------------------------------------
// Author:                    Magaly Vargas y Joaquín López
// Company:                   ALBALIA INTERACTIVA S.L.
// Assembly version:          1.0.0.0
// Date:                      22/02/2010
// Time:                      12:00
// Solution Name:             OffInvoiceWordAddIn
// Solution Filename:         OffInvoiceWordAddIn
// Solution FullFilename:     C:\Desarrollo\OffInvoiceWordAddIn
// Project Name:              OffInvoiceWordAddIn
// Project Filename:          OffInvoiceWordAddIn.csproj
// Project FullFilename:      C:\Desarrollo\OffInvoiceWordAddIn\OffInvoiceWordAddIn.csproj
// Project Item Name:         Ribbon1.cs
// Project Item Filename:     Ribbon1.cs
// Project Item FullFilename: C:\Desarrollo\OffInvoiceWordAddIn\Ribbon1.cs
// Project Item Kind:         Código
// Purpose:                   
//Copyright © 2009 - 2010 Albalia Interactiva S.L. Reservados todos los derechos.
// ----------------------------------------------------------------------------------------


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using OffInvoiceWordAddIn.XmlMngFiles;
using System.Globalization;
using OffInvoiceWordAddIn.FacturaeFiles;
using Microsoft.Office.Core;
using Microsoft.Office.Interop.Word;

namespace OffInvoiceWordAddIn
{
    public partial class Ribbon1
    {

        #region "Fields"

        /// <summary>
        /// Variable de tipo bool que indica si existe o no un control
        /// </summary>
        private bool InvoiceControlExists;

        /// <summary>
        /// Variable que referencia a la aplicacion
        /// </summary>
        Microsoft.Office.Interop.Word.Application application;

        /// <summary>
        /// Variable que referencia al parser que se encarga de manejar los archivos de gestion de facturas
        /// </summary>
        XmlFileMngParser parser;

        /// <summary>
        /// Variable de tipo ConfiData, que una vez instanciada no se elimina hasta que se cierra la aplicación
        /// que contiene la configuración predeterminada por el usuario.De esta manera no se consulta constantemente
        /// el archivo xml que almacena esta configuración.
        /// </summary>
        ConfigData configuration;

        /// <summary>
        /// Variable de tipo string que indica el estado de una factura
        /// </summary>
        string status = "";

        /// <summary>
        /// Variables de tipo int que refencian a una numeración específica de las tablas de una planilla facturae
        /// Si alguna de estas referencias falla, significa qe no estamos trabajando con una plantilla válida.
        /// </summary>
        int t2 = 0; int t3 = 0; int t4 = 0; int t5 = 0; int t6 = 0; int t7 = 0;

        /// <summary>
        /// Variable de tipo char[] que contiene los caracteres que se deben elimiar cuando se cogen los valores
        /// de los controles de la plantilla.
        /// </summary>
        char[] x = { '\r', '\a', '\n' };

        bool firstTaskpane = true;

        #endregion


        #region "EventHandler"

        /// <summary>
        /// Método que maneja el evento que se produce al abrir el Ribbon.
        /// Se carga el idioma y se inicializa todo.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {
            LoadLanguage();
            application = Globals.ThisAddIn.Application;
            parser = new XmlFileMngParser();
            status = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.Status);
            if (!string.IsNullOrEmpty(status))
            {
                if (status.Equals("ISSUED"))
                    ckBoxIssued.Checked = true;
                else if (status.Equals("RECEIVED"))
                    ckBoxReceived.Checked = true;
                else
                    ckBoxDraft.Checked = true;
            }
            else
            {
                status = "DRAFT";
                ckBoxDraft.Checked = true;
            }
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de nueva factura.
        /// Se abre la plantilla predeterminada por el usuario en la configuracion con los datos del emisor cargados,
        /// también definidos en la configuracón.Si la plantilla no es válida, se abre una por defecto que si lo es.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNew_Click(object sender, RibbonControlEventArgs e)
        {

            LoadConfiguration();

            if (File.Exists(configuration.UrlTemplate))
            {
                object temp = configuration.UrlTemplate;
                TemplateController template = new TemplateController();
                template.LoadInvoiceTemplate(temp, true);
                Globals.ThisAddIn.LoadIssuerData(configuration);

            }
            else
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoNotExistDefaultTemplate), msg.getMessage(ControlMessages.Msg.CaptionConfig), MessageBoxButtons.OK, MessageBoxIcon.Information);
                try
                {
                    Language labels = Language.getInstance();
                    object temp = Globals.ThisAddIn.EnvironmentVariable + Paths.TemplatePath + Globals.ThisAddIn.TemplatesDirectories + labels.getLabels("BasicTemplate")+".dotx";
                    TemplateController template = new TemplateController();
                    template.LoadInvoiceTemplate(temp, true);
                    Globals.ThisAddIn.LoadIssuerData(configuration);
                }
                catch (Exception)
                {

                }
            }
            status = "DRAFT";
            ckBoxDraft.Checked = true;
            ckBoxReceived.Checked = false;
            ckBoxIssued.Checked = false;
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de guardar.
        /// Muestra un cuadro de dialogo para guardar la facturae.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, RibbonControlEventArgs e)
        {
            try
            {

                updateRegistry(saved(status), false, "");

            }
            catch (Exception)
            {
            }

        }



        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de emitir.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnIssue_Click(object sender, RibbonControlEventArgs e)
        {
            //Emitir();
        }




        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de mis facturas.
        /// Muestra un TaskPane con los datos referentes a las facuras.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnMyInvoices_Click(object sender, RibbonControlEventArgs e)
        {

            if (!InvoiceControlExists)
            {
                Globals.ThisAddIn.OpenInvoiceTaskPane(this, firstTaskpane);
                firstTaskpane = false;


            }
            else
            {
                Globals.ThisAddIn.RemoveInvoiceTaskPane();
            }

            InvoiceControlExists = !InvoiceControlExists;
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de Configuración.
        /// Carga la cofiguración almacenada en el archivo XML y al mostrar el formulario de configuración le pasa
        /// la configuración.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSettings_Click(object sender, RibbonControlEventArgs e)
        {

            LoadConfiguration();
            FrmSettings frmSettings = new FrmSettings();
            frmSettings.Configuration = configuration;
            frmSettings.Show();

        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de emitir.
        /// Muestra un formulario donde el usuario selecciona el tipo de factura que desea realizar.
        /// Si es electrónica se llama a Emitir y si es en papel se llama a Cerrar.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnInvoiceType_Click(object sender, RibbonControlEventArgs e)
        {

            ContentControl control = null;
            try
            {
                control = Globals.ThisAddIn.getControlByTag(ControlList.Tag.IH_InvoiceNumber);
            }
            catch (Exception) { }

            if (control == null)
            {
                ControlMessages controlM = ControlMessages.getInstance();
                MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorWhiteDocument), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                return;
            }

            FrmInvoiceType f = new FrmInvoiceType();

            if (f.ShowDialog().Equals(DialogResult.OK))
            {
                if (f.Facturae31 || f.Facturae32 || f.UBL || f.CII)
                {
                    string id = Globals.ThisAddIn.GetControlValue(ControlList.Tag.customPartId);
                    CustomXMLPart facturaXMLPart = Globals.ThisAddIn.Application.ActiveDocument.CustomXMLParts.SelectByID(id);
                    if (facturaXMLPart == null)
                    {
                        if (f.Facturae31)
                        {
                            Emitir(InvoceTypes.FACTURAE_3_1);
                        }
                        else if (f.Facturae32)
                        {
                            Emitir(InvoceTypes.FACTURAE_3_2);
                        }
                        else if (f.UBL)
                        {
                            Emitir(InvoceTypes.UBL);
                        }
                        else if (f.CII)
                        {
                            Emitir(InvoceTypes.CII);
                        }
                    }
                    else
                    {
                        ControlMessages controlM = ControlMessages.getInstance();
                        MessageBox.Show(controlM.getMessage(ControlMessages.Msg.InvoiceAlReadySignated), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }


                }
                else
                {
                    Cerrar();
                }

            }



        }



        private void btLoadXmlInvoice_Click(object sender, RibbonControlEventArgs e)
        {


            OpenFileDialog op = new OpenFileDialog();
            string filter = "Archivos Xml (*.xml)|*.xml";
            op.Filter = filter;

            if (op.ShowDialog().Equals(DialogResult.OK))
            {
                string file = op.FileName;

                XmlDocument doc = new XmlDocument();
                doc.PreserveWhitespace = true;
                try
                {
                    doc.Load(file);
                }
                catch (Exception)
                {
                    ControlMessages msg = ControlMessages.getInstance();
                    MessageBox.Show(msg.getMessage(ControlMessages.Msg.XmlMalformed), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    return;
                }

                if (doc.DocumentElement.NamespaceURI.Equals("urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"))
                {
                    LoadController load = new LoadController();
                    load.LoadUBL(file, false, false, true);
                }
                else if (doc.DocumentElement.NamespaceURI.Equals("urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:1"))
                {
                    LoadController load = new LoadController();
                    load.LoadCII(file, false, false, true);
                }
                else
                {
                    LoadController load = new LoadController();
                    load.LoadFacturae(file, false, false, true);
                }
                Globals.ThisAddIn.setControlValue(ControlList.Tag.IH_InvoiceNumber, string.Empty);
                Globals.ThisAddIn.setControlValue(ControlList.Tag.CORR_InvoiceNumber, string.Empty);
                Globals.ThisAddIn.setControlValue(ControlList.Tag.CORR_InvoiceSeriesCode, string.Empty);


                TemplateController template = new TemplateController();
                template.enumerateTables();
                try
                {
                    Globals.ThisAddIn.Application.ActiveDocument.Tables[template.t4].Rows[2].Range.Text = string.Empty;
                }
                catch (Exception)
                {

                }
                status = "DRAFT";
                ckBoxDraft.Checked = true;
                ckBoxReceived.Checked = false;
                ckBoxIssued.Checked = false;
            }
        }





        /// <summary>
        /// Método que abre una galeria de imágenes donde el usurio puede elegir la plantilla con la que desea trabajar.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void wordTemplatesGallery_Click(object sender, RibbonControlEventArgs e)
        {

            LoadConfiguration();
            object temp = null;
            try
            {
                //temp = Globals.ThisAddIn.EnvironmentVariable + Paths.TemplatePath + Globals.ThisAddIn.TemplatesDirectories + wordTemplatesGallery.SelectedItem.Tag.ToString() + ".dotx";
                temp = Globals.ThisAddIn.EnvironmentVariable + Paths.TemplatePath + Globals.ThisAddIn.TemplatesDirectories + gallerySelectedItem() + ".dotx";
            }
            catch (Exception) { }

            TemplateController template = new TemplateController();
            template.LoadInvoiceTemplate(temp, true);
            if (configuration != null)
            {
                Globals.ThisAddIn.LoadIssuerData(configuration);
            }

            status = "DRAFT";
            ckBoxDraft.Checked = true;
            ckBoxReceived.Checked = false;
            ckBoxIssued.Checked = false;
            Globals.ThisAddIn.setControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.Status, status);
        }


        private string gallerySelectedItem()
        {
            Language labels = Language.getInstance();
            string selecteditemtext = labels.getLabels("BasicTemplate");
            try
            {
                int index = this.wordTemplatesGallery.SelectedItemIndex;
                selecteditemtext = this.wordTemplatesGallery.Items[index].Tag.ToString();
            }
            catch (Exception) { }

            return selecteditemtext;
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el botón de agregar a facturas recibidas.
        /// Se realiza una validacion de la factura, si todo está bien se añade a recibidas y se actualizan los archivos 
        /// de gestión.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpenRecivedFacturae_Click(object sender, RibbonControlEventArgs e)
        {
            ContentControl control = null;
            try
            {
                control = Globals.ThisAddIn.getControlByTag(ControlList.Tag.IH_InvoiceNumber);
            }
            catch (Exception) { }

            if (control != null)
            {

                try
                {
                    ValidateController v = new ValidateController(Globals.ThisAddIn.GetControlValue(ControlList.Tag.customPartId), true);
                    //if (!Globals.ThisAddIn.validateReceivedInvoice(true))
                    if (!v.result)
                    {
                        return;
                    }
                    ckBoxIssued.Checked = false;
                    ckBoxDraft.Checked = false;
                    Globals.ThisAddIn.getControlByTag(ControlList.Tag.Status).LockContents = false;
                    status = "RECEIVED";
                    Globals.ThisAddIn.setControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.Status, status);

                    Globals.ThisAddIn.getControlByTag(ControlList.Tag.Status).LockContents = true;
                    //Cargo la configuración porque puede darse el caso de que no este cargado todavia
                    LoadConfiguration();

                    string invType = "(P)";
                    string id = Globals.ThisAddIn.GetControlValue(ControlList.Tag.customPartId);
                    if (!string.IsNullOrEmpty(id))
                    {
                        CustomXMLPart customPart = Globals.ThisAddIn.Application.ActiveDocument.CustomXMLParts.SelectByID(id);
                        XmlDocument doc = new XmlDocument();
                        doc.PreserveWhitespace = true;
                        doc.LoadXml(customPart.DocumentElement.XML);

                        XmlNode signatureNode = doc.DocumentElement.GetElementsByTagName("Signature").Item(0);
                        if (signatureNode == null)
                            signatureNode = doc.DocumentElement.GetElementsByTagName("ds:Signature").Item(0);
                        if (signatureNode != null)
                        {
                            invType = "(E)";
                        }
                        else
                        {
                            invType = "(P)";
                        }


                    }
                    updateRegistry(configuration.UrlRecived + @"\" + Globals.ThisAddIn.Application.ActiveDocument.Name, true, invType);
                    ckBoxIssued.Checked = false;
                    ckBoxReceived.Checked = true;
                    ckBoxDraft.Checked = false;
                    Globals.ThisAddIn.updateTaskPane();
                    ControlMessages msg = ControlMessages.getInstance();
                    MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoAddRecived), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                }
                catch (Exception exc)
                {
                    ControlMessages msg = ControlMessages.getInstance();
                    if (exc.Message.Equals("InfoInvoiceExist"))
                    {
                        MessageBox.Show(msg.getMessage(exc.Message), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }

                    string error = string.Concat(msg.getMessage(ControlMessages.Msg.ErrorAddRecived), "\n", exc.Message);
                    MessageBox.Show(error, msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                ControlMessages controlM = ControlMessages.getInstance();
                MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorWhiteDocument), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);

            }

        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el botón de cerrar factura
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClose_Click(object sender, RibbonControlEventArgs e)
        {
            Cerrar();
        }




        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el checkboox de Emitida.
        /// Se llama al método que actualiza el estado.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ckBoxIssued_Click(object sender, RibbonControlEventArgs e)
        {
            updateStatusCheck();

        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el checkboox de Recibida.
        /// Se llama al método que actualiza el estado.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ckBoxReceived_Click(object sender, RibbonControlEventArgs e)
        {

            updateStatusCheck();
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el checkboox de Borrador.
        /// Se llama al método que actualiza el estado.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ckBoxDraft_Click(object sender, RibbonControlEventArgs e)
        {
            updateStatusCheck();
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el botón de extraer factura.
        /// Abre un cuadro de dialogo donde el usuario elige donde quiere guardar la factura xml
        /// y se extrae la factura.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btExportToXml_Click(object sender, RibbonControlEventArgs e)
        {
            SaveFileDialog sd = new SaveFileDialog();
            sd.Filter = "Archivos Xml (*.xml)|*.xml";
            sd.ShowDialog();
            string path = sd.FileName;
            try
            {
                ExportController export = new ExportController();
                export.extraerfacturae(path, true);
            }
            catch (Exception)
            {
                try
                {
                    ExportController export = new ExportController();
                    export.exportPaperInvoice(path, true);
                }
                catch (Exception)
                {
                    ControlMessages controlM = ControlMessages.getInstance();
                    MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorInvoiceNotGenerated), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);

                }
            }
        }



        /// <summary>
        /// Método que maneja el evento que se produce al hacer click sobre el boton de validar factura.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btInvoiceValidation_Click(object sender, RibbonControlEventArgs e)
        {
            try
            {
                ContentControl control = null;
                try
                {
                    control = Globals.ThisAddIn.getControlByTag(ControlList.Tag.IH_InvoiceNumber);
                }
                catch (Exception) { }

                if (control != null)
                {
                    //Globals.ThisAddIn.validateReceivedInvoice(false);
                    ValidateController v = new ValidateController(Globals.ThisAddIn.GetControlValue(ControlList.Tag.customPartId), false);
                }
                else
                {
                    ControlMessages controlM = ControlMessages.getInstance();
                    MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorWhiteDocument), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);

                }
            }
            catch (Exception)
            {
                ControlMessages controlM = ControlMessages.getInstance();
                MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorWhiteDocument), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
            }
        }


        /// <summary>
        /// Método que maneja el evento que se produce cuando se hace click con el ratón sobre el
        /// boton de importar factura.
        /// Se abre un cuadro de dialogo donde el usuario seleccioana la factura xml que desea cargar,
        /// se realiza una validacion de la factura, si es válida se carga en la plantilla que mejor
        /// se ajuste, si no es válida se le informa al usuario y se le da la posibilidad de ver los
        /// resultados de la validación
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnImportReceivedInvoice_Click(object sender, RibbonControlEventArgs e)
        {



            OpenFileDialog op = new OpenFileDialog();
            string filter = "Archivos Xml (*.xml)|*.xml";
            op.Filter = filter;
            op.ShowDialog();
            string file = op.FileName;
            ControlMessages msg = ControlMessages.getInstance();


            if (!string.IsNullOrEmpty(file))
            {

                try
                {
                    ImportInvoiceController iic = new ImportInvoiceController(file);


                    Globals.ThisAddIn.setControlValue(ControlList.Tag.Status, "RECEIVED");
                    ckBoxReceived.Checked = true;
                    ckBoxIssued.Checked = false;
                    ckBoxDraft.Checked = false;
                    status = "RECEIVED";
                }
                catch (Exception exc)
                {
                    if (exc.Message.Equals("1"))
                    {
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorSchema), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                        return;
                    }
                    if (exc.Message.Equals(ControlMessages.Msg.XmlMalformed.ToString("g")))
                    {
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.XmlMalformed), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                        return;
                    }
                    MessageBox.Show(msg.getMessage(exc.Message), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }

            }

        }

        #endregion

        #region "Public Methods"



        /// <summary>
        /// Método que carga el archivo de idioma y establece los textos de los controles
        /// en el idioma que corresponde.
        /// </summary>
        public void LoadLanguage()
        {
            try
            {
                Language labels = Language.getInstance();
                btnNew.Label = labels.getLabels(btnNew.Name);
                btnOpenReceivedFacturae.Label = labels.getLabels(btnOpenReceivedFacturae.Name);
                btnSave.Label = labels.getLabels(btnSave.Name);
                btnInvoiceType.Label = labels.getLabels(btnInvoiceType.Name);
                btnMyInvoices.Label = labels.getLabels(btnMyInvoices.Name);
                btLoadXmlInvoice.Label = labels.getLabels(btLoadXmlInvoice.Name);
                btExportToXml.Label = labels.getLabels(btExportToXml.Name);
                btnSettings.Label = labels.getLabels(btnSettings.Name);
                ckBoxIssued.Label = labels.getLabels(ckBoxIssued.Name);
                ckBoxReceived.Label = labels.getLabels(ckBoxReceived.Name);
                ckBoxDraft.Label = labels.getLabels(ckBoxDraft.Name);
                gbxFacturae.Label = labels.getLabels(gbxFacturae.Name);
                gbxTemplates.Label = labels.getLabels(gbxTemplates.Name);
                gpStatus.Label = labels.getLabels(gpStatus.Name);
                wordTemplatesGallery.Label = labels.getLabels(wordTemplatesGallery.Name);
                btInvoiceValidation.Label = labels.getLabels(btInvoiceValidation.Name);
                gbxXML.Label = labels.getLabels(gbxXML.Name);
                gbxReceivedInvoices.Label = labels.getLabels(gbxReceivedInvoices.Name);
                btnImportReceivedInvoice.Label = labels.getLabels(btnImportReceivedInvoice.Name);
                btnNew.ScreenTip = labels.getLabels(btnNew.Name);
                btnSave.ScreenTip = labels.getLabels(btnSave.Name);
                btnInvoiceType.ScreenTip = labels.getLabels(btnInvoiceType.Name);
                btnSettings.ScreenTip = labels.getLabels(btnSettings.Name);
                btnMyInvoices.ScreenTip = labels.getLabels(btnMyInvoices.Name);
                btnImportReceivedInvoice.ScreenTip = labels.getLabels(btnImportReceivedInvoice.Name);
                btInvoiceValidation.ScreenTip = labels.getLabels(btInvoiceValidation.Name);
                btnOpenReceivedFacturae.ScreenTip = labels.getLabels(btnOpenReceivedFacturae.Name);
                btLoadXmlInvoice.ScreenTip = labels.getLabels(btLoadXmlInvoice.Name);
                btExportToXml.ScreenTip = labels.getLabels(btExportToXml.Name);
                wordTemplatesGallery.ScreenTip = labels.getLabels(wordTemplatesGallery.Name);
                ckBoxDraft.ScreenTip = labels.getLabels("gbxStatusScreenTip");
                ckBoxIssued.ScreenTip = labels.getLabels("gbxStatusScreenTip");
                ckBoxReceived.ScreenTip = labels.getLabels("gbxStatusScreenTip");
                btnNew.SuperTip = labels.getLabels("btnNewSuperTip");
                btnSave.SuperTip = labels.getLabels("btnSaveSuperTip");
                btnInvoiceType.SuperTip = labels.getLabels("btnInvoiceTypeSuperTip");
                btnSettings.SuperTip = labels.getLabels("btnSettingsSuperTip");
                btnMyInvoices.SuperTip = labels.getLabels("btnMyInvoicesSuperTip");
                btnImportReceivedInvoice.SuperTip = labels.getLabels("btnImportReceivedInvoiceSuperTip");
                btInvoiceValidation.SuperTip = labels.getLabels("btInvoiceValidationSuperTip");
                btnOpenReceivedFacturae.SuperTip = labels.getLabels("btnOpenReceivedFacturaeSuperTip");
                btLoadXmlInvoice.SuperTip = labels.getLabels("btLoadXmlInvoiceSuperTip");
                btExportToXml.SuperTip = labels.getLabels("btExportToXmlSuperTip");
                wordTemplatesGallery.SuperTip = labels.getLabels("wordTemplatesGallerySuperTip");
                ckBoxDraft.SuperTip = labels.getLabels("gbxStatusSuperTip");
                ckBoxIssued.SuperTip = labels.getLabels("gbxStatusSuperTip");
                ckBoxReceived.SuperTip = labels.getLabels("gbxStatusSuperTip");
                ribbonDropDownItemImpl1.Label = labels.getLabels("BasicTemplateLabel");
                ribbonDropDownItemImpl1.Tag = labels.getLabels("BasicTemplate");
                ribbonDropDownItemImpl2.Label = labels.getLabels("ThirdTemplateLabel");
                ribbonDropDownItemImpl2.Tag = labels.getLabels("ThirdTemplate");
                ribbonDropDownItemImpl3.Label = labels.getLabels("CorrectiveTemplateLabel");
                ribbonDropDownItemImpl3.Tag = labels.getLabels("CorrectiveTemplate");
                ribbonDropDownItemImpl4.Label = labels.getLabels("CorrectiveAndThirdTemplateLabel");
                ribbonDropDownItemImpl4.Tag = labels.getLabels("CorrectiveAndThirdTemplate");


            }
            catch (Exception)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorLoadLanguage), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


        }

        /// <summary>
        /// Método que carga la configuración predeterminada por el usuario de un archivo xml
        /// </summary>
        public void LoadConfiguration()
        {
            //Si no se ha cargado la configuración
            if (configuration == null)
            {
                //Creo una nueva
                configuration = new ConfigData();
                //Si no se puede cargar la configuración
                if (!(XmlFile.LoadObjectFrom(ref configuration, Globals.ThisAddIn.EnvironmentVariable + Paths.ConfigPath)))
                {
                    //Pido al usuario si kiere configurarla o si no se creara uno en blanco
                    ControlMessages msg = ControlMessages.getInstance();
                    //Si si kiere le muestro el formulario de configuracion
                    if (MessageBox.Show(String.Concat(msg.getMessage(ControlMessages.Msg.ErrorLoadConfig), "\n", msg.getMessage(ControlMessages.Msg.InfoConfigModifyOrEmpty), "\n", msg.getMessage(ControlMessages.Msg.InfoConfigQuestion)), msg.getMessage(ControlMessages.Msg.CaptionConfig), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        //XmlFile.Save(config, pathConfig, config.GetType());
                        FrmSettings frmSettings = new FrmSettings();
                        frmSettings.Configuration = configuration;
                        frmSettings.Show();
                    }
                    //Sino creo uno en blanco
                    else
                    {
                        XmlFile.Save(configuration, Globals.ThisAddIn.EnvironmentVariable + Paths.ConfigPath, configuration.GetType());
                    }
                }
            }
        }

        /// <summary>
        /// Método que actualiza los archivos de gestion de las facturas
        /// </summary>
        /// <param name="SavePath">Parámetro de tipo string que contiene el path físico donde se ha guardado la factura</param>
        /// <param name="agregarRecibidas">Parámetro de tipo bool que indica si es una factura que se quiere añadir a recibidas</param>
        /// <param name="InvoiceType">Parámetro de tipo string que indica el tipo de factura</param>
        public void updateRegistry(string SavePath, bool agregarRecibidas, string InvoiceType)
        {
            if (string.IsNullOrEmpty(SavePath))
            {
                return;
            }
            if (string.IsNullOrEmpty(status))
            {
                ControlMessages msg = ControlMessages.getInstance();
                throw new Exception(msg.getMessage(ControlMessages.Msg.InfoSaveWhiteDoc));
            }
            else
            {
                string path = SavePath;
                if (path.IndexOf(".docx") < 0)
                {
                    path = path + ".docx";
                }
                if (!path.Equals(string.Empty))
                {
                    try
                    {
                        string serie = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceSeriesCode);
                        string fecha = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.InvIssue_IssueDate);
                        string n_factura = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceNumber);
                        string cif = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.BP_TaxIdentificationNumber);
                        string customer = "";
                        string customerFirstName = "";
                        string customerSecondName = "";
                        string issuerName = "";
                        string issuerFirstName = "";
                        string issuerSecondName = "";

                        enumerateTables();

                        if (string.IsNullOrEmpty(serie) || string.IsNullOrEmpty(cif) || string.IsNullOrEmpty(n_factura) || Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.BP_PersonTypeCode) == null)
                        {
                            if (!agregarRecibidas)
                            {
                                ControlMessages msg = ControlMessages.getInstance();
                                throw new Exception(msg.getMessage(ControlMessages.Msg.InfoCheckDraft));
                            }

                        }

                        if (controlValue(ControlList.Tag.BP_PersonTypeCode, getControlValueByTag(ControlList.Tag.BP_PersonTypeCode)).ToLower().Equals("f"))
                        {
                            customer = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.BP_Name);
                            customerFirstName = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.BP_FirstSurname);
                            customerSecondName = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.BP_SecondSurname);
                        }
                        else
                            customer = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.BP_CorporateName);

                        if (controlValue(ControlList.Tag.SP_PersonTypeCode, getControlValueByTag(ControlList.Tag.SP_PersonTypeCode)).ToLower().Equals("f"))
                        {
                            issuerName = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.SP_Name);
                            issuerFirstName = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.SP_FirstSurname);
                            issuerSecondName = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.SP_SecondSurname);
                        }
                        else
                            issuerName = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.SP_CorporateName);



                        string importeT = Globals.ThisAddIn.Application.ActiveDocument.Tables[t5].Rows.Last.Cells[3].Range.Text.Trim(x).Trim();

                        //CultureInfo cultDate = new CultureInfo("es-ES");
                        CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
                        DateTime issueDate = DateTime.Parse(fecha, cult);


                        parser = new XmlFileMngParser();
                        parser.addNewXmlInvoiceRecord(issueDate.Year.ToString(), issueDate.Month.ToString(), status, new XmlInvoice(serie, n_factura, cif, customer, customerFirstName, customerSecondName, issuerName, issuerFirstName, issuerSecondName, fecha, importeT, status, "", path, InvoiceType));

                        object filename = path; object missing = System.Reflection.Missing.Value;



                        Globals.ThisAddIn.Application.ActiveDocument.SaveAs(ref filename, ref missing, ref missing, ref missing, ref missing, ref missing,
                        ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
                        Globals.ThisAddIn.updateTaskPane();
                    }
                    catch (Exception e)
                    {
                        ControlMessages msg = ControlMessages.getInstance();
                        if (e.Message.Equals("InfoInvoiceExist"))
                        {
                            throw e;
                        }
                        MessageBox.Show(e.Message, msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        /// <summary>
        /// Método que comprueba si el documento activo es una plantilla válida de facturae.
        /// Para ello se basa en la numeración fija de las tablas.
        /// </summary>
        public void enumerateTables()
        {
            try
            {
                Microsoft.Office.Interop.Word.Document document = Globals.ThisAddIn.Application.ActiveDocument;

                int count = document.Tables.Count;
                if (count <= 0)
                {
                    ControlMessages msg = ControlMessages.getInstance();
                    throw new Exception(msg.getMessage(ControlMessages.Msg.ErrorNotValidTemplate));
                }
                else
                {

                    for (int i = 2; i <= document.Tables.Count; i++)
                    {
                        try
                        {
                            string table = document.Tables[i].Rows[1].Cells[1].Range.Text.Trim(x).Trim();
                            switch (table)
                            {

                                case "2":
                                    t2 = i; break;
                                case "3":
                                    t3 = i; break;
                                case "6":
                                    t4 = i; break;
                                case "4":
                                    t5 = i; break;
                                case "1":
                                    t6 = i; break;
                                case "7":
                                    t7 = i; break;

                            }
                        }
                        catch (Exception) { }
                    }
                }
            }
            catch (Exception) { }

        }

        /// <summary>
        /// Método que actualiza los check de estado
        /// </summary>
        public void updateStatusCheck()
        {
            bool i = false;
            bool r = false;
            bool d = false;
            if (status.Equals("ISSUED"))
            {
                i = true;
            }
            if (status.Equals("RECEIVED"))
            {
                r = true;
            }
            if (status.Equals("DRAFT"))
            {
                d = true;
            }
            ckBoxIssued.Checked = i;
            ckBoxReceived.Checked = r;
            ckBoxDraft.Checked = d;
        }

        /// <summary>
        /// Método que cierra una factua en papel
        /// Igual que el metodo de emitir pero sin firma.
        /// </summary>
        public void Cerrar()
        {
            LoadConfiguration();
            SaveFileDialog op = new SaveFileDialog();
            op.Filter = "Arhivos de Word 2007 (*.docx)|*.docx";
            op.InitialDirectory = setInitiaDirectory("ISSUED");
            string name = string.Concat(Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.SP_TaxIdentificationNumber), Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceNumber), Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceSeriesCode));
            op.FileName = name;
            if (op.ShowDialog() == DialogResult.Cancel)
            {
                return;
            }
            string path = Globals.ThisAddIn.EnvironmentVariable + Paths.CustomXmlPartPath;

            if (!string.IsNullOrEmpty(op.FileName))
            {
                try
                {

                    //Globals.ThisAddIn.cerrarFactura(path, configuration);
                    IssuedController emitir = new IssuedController();
                    emitir.cerrarFactura(path, configuration);


                    ckBoxIssued.Checked = true;
                    ckBoxReceived.Checked = false;
                    ckBoxDraft.Checked = false;
                    status = "ISSUED";
                    Globals.ThisAddIn.setControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.Status, status);


                    string serie = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceSeriesCode);
                    string n_factura = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceNumber);
                    string cif = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.BP_TaxIdentificationNumber);

                    //Añado la factura al registro de emitidos.

                    updateRegistry(op.FileName, false, "(P)");
                    object readOnly = true; object missing = System.Reflection.Missing.Value;
                    object filename = op.FileName;

                    Globals.ThisAddIn.Application.ActiveDocument.SaveAs(ref filename, ref missing, ref missing, ref missing, ref missing, ref missing, ref readOnly, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
                    ControlMessages msg = ControlMessages.getInstance();
                    MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoGeneratedInvoice), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information);

                    string fecha = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.InvIssue_IssueDate);
                    //CultureInfo cultDate = new CultureInfo("es-ES");
                    CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
                    DateTime issueDate = DateTime.Parse(fecha, cult);
                    //Elimino el borrador
                    parser.removeInvoive(serie, n_factura, cif, Globals.ThisAddIn.EnvironmentVariable + Paths.DraftPath + issueDate.Year.ToString() + issueDate.Month.ToString() + ".xml");
                    Globals.ThisAddIn.updateTaskPane();
                }
                catch (Exception ex)
                {
                    ControlMessages msg = ControlMessages.getInstance();
                    if (ex.Message.Equals("InfoInvoiceExist"))
                    {
                        MessageBox.Show(msg.getMessage(ex.Message), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }

                    MessageBox.Show(ex.Message, msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        /// <summary>
        /// Metodo que muestra al usuario el cuadro de dialogo para que seleccione donde desea 
        /// guardar la factura
        /// </summary>
        /// <param name="status"></param>
        /// <returns></returns>
        public string saved(string status)
        {

            if (string.IsNullOrEmpty(Globals.ThisAddIn.Application.ActiveDocument.Path))
            {
                SaveFileDialog f = new SaveFileDialog();
                f.Filter = "Todos los archivos (*.*)|*.*|Documentos de Word (*.docx)|*.docx|Archivos XML (*.xml)|*.xml";
                f.RestoreDirectory = true;
                f.InitialDirectory = setInitiaDirectory(status);
                string name = string.Concat(Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.SP_TaxIdentificationNumber), "_", Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceNumber), "_", Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceSeriesCode), "_", "(Draft)");
                f.FileName = name;
                if (f.ShowDialog().Equals(DialogResult.Cancel))
                {
                    throw new Exception();
                }
                return f.FileName;
            }
            else
            {
                Globals.ThisAddIn.Application.ActiveDocument.Save();
                updateRegistry(Globals.ThisAddIn.Application.ActiveDocument.Path + @"\" + Globals.ThisAddIn.Application.ActiveDocument.Name, false, "");
                return string.Empty;
            }


        }

        /// <summary>
        /// Método que devuelve el path donde se encuentran las facturas que deterina el estado.
        /// </summary>
        /// <param name="status"></param>
        /// <returns></returns>
        public string setInitiaDirectory(string status)
        {

            LoadConfiguration();
            if (status.ToUpper().Equals("ISSUED".ToUpper()))
                return configuration.UrlIssued;
            else
                if (status.ToUpper().Equals("RECEIVED".ToUpper()))
                    return configuration.UrlRecived;
                else
                    return configuration.UrlDrafts;



        }

        /// <summary>
        /// Método que emite una factura.
        /// Abre el cuadro de diálogo para que el usuario indique donde quiere guardar la factura,
        /// por defecto será en la carpeta de facturas emitidas definida en la configuración, despues
        /// se llama a emiir factura donde se genera la factura, se hace la validacion contable, se firma
        /// y se valdia la firma.Si todo va bien, se actualizan los archivos de gestión, agregando la factura
        /// al archivo de emitidas y eliminandolo de borradore si exisiera.
        /// </summary>
        private void Emitir(int format)
        {
            ControlMessages msg = ControlMessages.getInstance();
            Globals.ThisAddIn.LoadCountryComboBox();
            LoadConfiguration();
            string check = ComprobarDatosObligatorios();
            if (!String.IsNullOrEmpty(check))
            {
                MessageBox.Show(msg.getMessage("MsgIncompleteData"), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information);
                try
                {
                    Globals.ThisAddIn.getControlByTag(check).Range.Select();
                }
                catch (Exception)
                {
                }
                return;
            }


            SaveFileDialog op = new SaveFileDialog();
            op.Filter = "Arhivos de Word 2010 (*.docx)|*.docx";
            op.InitialDirectory = setInitiaDirectory("ISSUED");
            string name = string.Concat(Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.SP_TaxIdentificationNumber), Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceNumber), Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceSeriesCode));
            op.FileName = name;

            if (op.ShowDialog() == DialogResult.Cancel)
            {
                return;
            }
            string path = Globals.ThisAddIn.EnvironmentVariable + Paths.CustomXmlPartPath;
            string pathSignate = Globals.ThisAddIn.EnvironmentVariable + Paths.SignateCustomXmlPartPath;

            if (!string.IsNullOrEmpty(op.FileName))
            {
                try
                {


                    //Globals.ThisAddIn.emitirFactura(path, pathSignate, configuration);
                    IssuedController emitir = new IssuedController();
                    emitir.issuedInvoice(path, pathSignate, configuration, format);


                    ckBoxIssued.Checked = true;
                    ckBoxReceived.Checked = false;
                    ckBoxDraft.Checked = false;
                    status = "ISSUED";

                    Globals.ThisAddIn.setControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.Status, status);

                    string serie = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceSeriesCode);
                    string n_factura = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.IH_InvoiceNumber);
                    string cif = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.BP_TaxIdentificationNumber);


                    //Añado la factura al registro de emitidos.
                    updateRegistry(op.FileName, false, "(E)");

                    object readOnly = true; object missing = System.Reflection.Missing.Value;
                    object filename = op.FileName;


                    string data = Globals.ThisAddIn.GetXmlFromResource(pathSignate);
                    Globals.ThisAddIn.AddCustomXmlPart(data, Globals.ThisAddIn.Application.ActiveDocument);


                    Globals.ThisAddIn.Application.ActiveDocument.Save();

                    string fecha = Globals.ThisAddIn.GetControlValue(OffInvoiceWordAddIn.FacturaeFiles.ControlList.Tag.InvIssue_IssueDate);
                    //CultureInfo cultDate = new CultureInfo("es-ES");
                    CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
                    DateTime issueDate = DateTime.Parse(fecha, cult);

                    //Elimino el borrador
                    parser.removeInvoive(serie, n_factura, cif, Globals.ThisAddIn.EnvironmentVariable + Paths.DraftPath + issueDate.Year.ToString() + issueDate.Month.ToString() + ".xml");


                    Globals.ThisAddIn.updateTaskPane();


                    MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoGeneratedInvoice), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
                catch (Exception ex)
                {
                    if (ex.Message.Equals("ErrorCertificateNull") || ex.Message.Equals("NotSigned"))
                        return;
                    if (ex.Message.Equals("ErrorCheckSignature"))
                    {
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoInvoiceValidation), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    if (ex.Message.Equals("ErrorCorrectiveReason"))
                    {
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorCorrectiveReason), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    if (ex.Message.Equals("ErrorCorrectiveMethod"))
                    {
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorCorrectiveMethod), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    if (ex.Message.Equals("InfoInvoiceExist"))
                    {
                        MessageBox.Show(msg.getMessage(ex.Message), msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    MessageBox.Show(ex.Message, msg.getMessage(ControlMessages.Msg.CaptionRibbon), MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }


        public string ComprobarDatosObligatorios()
        {
            Dictionary<String, String> d = new Dictionary<String, String>();
            foreach (Microsoft.Office.Interop.Word.ContentControl item in Globals.ThisAddIn.Application.ActiveDocument.ContentControls)
            {
                if (!string.IsNullOrEmpty(item.Tag) && !string.IsNullOrEmpty(item.Range.Text))
                {
                    string value = item.Range.Text.Trim();
                    if (item.Tag.Equals("TH_PersonTypeCode")
                        || item.Tag.Equals("TH_ResidenceTypeCode")
                        || item.Tag.Equals("TH_CountryCode")
                        || item.Tag.Equals("SP_PersonTypeCode")
                        || item.Tag.Equals("SP_ResidenceTypeCode")
                        || item.Tag.Equals("SP_CountryCode")
                        || item.Tag.Equals("BP_PersonTypeCode")
                        || item.Tag.Equals("BP_ResidenceTypeCode")
                        || item.Tag.Equals("BP_CountryCode")
                        || item.Tag.Equals("IH_InvoiceDocumentType")
                        || item.Tag.Equals("IH_InvoiceClass")
                        || item.Tag.Equals("CORR_ReasonCode")
                        || item.Tag.Equals("CORR_ReasonDescription")
                        || item.Tag.Equals("InvoiceIssuerType"))
                    {
                        /*si lo encontramos buscamos el valor correspondiente al texto seleccionado*/
                        foreach (ContentControlListEntry entry in item.DropdownListEntries)
                        {
                            if (!string.IsNullOrEmpty(item.Tag))
                            {
                                if (entry.Text.ToLower().Equals(value.ToLower()))
                                {
                                    value = entry.Value; break;
                                }
                            }

                        }
                    }
                    d.Add(item.Tag, value);
                }
            }
            if (String.IsNullOrEmpty(d["InvIssue_IssueDate"]))
            {
                return ("InvIssue_IssueDate");
            }
            if (String.IsNullOrEmpty(d["IH_InvoiceSeriesCode"]))
            {
                return ("IH_InvoiceSeriesCode");
            }
            if (String.IsNullOrEmpty(d["IH_InvoiceNumber"]))
            {
                return ("IH_InvoiceNumber");
            }
            if (String.IsNullOrEmpty(d["IH_InvoiceClass"]))
            {
                return ("IH_InvoiceClass");
            }
            if (d["IH_InvoiceClass"].Equals("OR"))
            {
                if (String.IsNullOrEmpty(d["CORR_InvoiceSeriesCode"]))
                {
                    return ("CORR_InvoiceSeriesCode");
                }
                if (String.IsNullOrEmpty(d["CORR_InvoiceNumber"]))
                {
                    return ("CORR_InvoiceNumber");
                }
                if (String.IsNullOrEmpty(d["CORR_ReasonDescription"]))
                {
                    return ("CORR_ReasonDescription");
                }
                if (String.IsNullOrEmpty(d["CORR_CorrectionMethodDescription"]))
                {
                    return ("CORR_CorrectionMethodDescription");
                }
                if (String.IsNullOrEmpty(d["CORR_TaxPeriod_StartDate"]))
                {
                    return ("CORR_TaxPeriod_StartDate");
                }
                if (String.IsNullOrEmpty(d["CORR_TaxPeriod_EndDate"]))
                {
                    return ("CORR_TaxPeriod_EndDate");
                }

            }
            if (String.IsNullOrEmpty(d["SP_PersonTypeCode"]))
            {
                return ("SP_PersonTypeCode");
            }
            if (d["SP_PersonTypeCode"].Equals("F"))
            {
                if (String.IsNullOrEmpty(d["SP_Name"]))
                {
                    return ("SP_Name");
                }
                if (String.IsNullOrEmpty(d["SP_FirstSurname"]))
                {
                    return ("SP_FirstSurname");
                }
            }
            else if (d["SP_PersonTypeCode"].Equals("J"))
            {
                if (String.IsNullOrEmpty(d["SP_CorporateName"]))
                {
                    return ("SP_CorporateName");
                }
            }
            else
            {
                return "Tipo Persona No definido";
            }
            if (String.IsNullOrEmpty(d["SP_ResidenceTypeCode"]))
            {
                return ("SP_ResidenceTypeCode");
            }
            if (String.IsNullOrEmpty(d["SP_TaxIdentificationNumber"]))
            {
                return ("SP_TaxIdentificationNumber");
            }
            if (String.IsNullOrEmpty(d["SP_ResidenceTypeCode"]))
            {
                return ("SP_ResidenceTypeCode");
            }
            if (String.IsNullOrEmpty(d["SP_Address"]))
            {
                return ("SP_Address");
            }
            if (String.IsNullOrEmpty(d["SP_CountryCode"]))
            {
                return ("SP_CountryCode");
            }
            if (String.IsNullOrEmpty(d["SP_PostCode"]))
            {
                return ("SP_PostCode");
            }
            if (String.IsNullOrEmpty(d["SP_Province"]))
            {
                return ("SP_Province");
            }
            if (String.IsNullOrEmpty(d["SP_Town"]))
            {
                return ("SP_Town");
            }

            if (String.IsNullOrEmpty(d["BP_PersonTypeCode"]))
            {
                return ("BP_PersonTypeCode");
            }
            if (d["BP_PersonTypeCode"].Equals("F"))
            {
                if (String.IsNullOrEmpty(d["BP_Name"]))
                {
                    return ("BP_Name");
                }
                if (String.IsNullOrEmpty(d["BP_FirstSurname"]))
                {
                    return ("BP_FirstSurname");
                }
            }
            else if (d["BP_PersonTypeCode"].Equals("J"))
            {
                if (String.IsNullOrEmpty(d["BP_CorporateName"]))
                {
                    return ("BP_CorporateName");
                }
            }
            else
            {
                return "Tipo Persona No definido";
            }
            if (String.IsNullOrEmpty(d["BP_ResidenceTypeCode"]))
            {
                return ("BP_ResidenceTypeCode");
            }
            if (String.IsNullOrEmpty(d["BP_TaxIdentificationNumber"]))
            {
                return ("BP_TaxIdentificationNumber");
            }
            if (String.IsNullOrEmpty(d["BP_ResidenceTypeCode"]))
            {
                return ("BP_ResidenceTypeCode");
            }
            if (String.IsNullOrEmpty(d["BP_Address"]))
            {
                return ("BP_Address");
            }
            if (String.IsNullOrEmpty(d["BP_CountryCode"]))
            {
                return ("BP_CountryCode");
            }
            if (String.IsNullOrEmpty(d["BP_PostCode"]))
            {
                return ("BP_PostCode");
            }
            if (String.IsNullOrEmpty(d["BP_Province"]))
            {
                return ("BP_Province");
            }
            if (String.IsNullOrEmpty(d["BP_Town"]))
            {
                return ("BP_Town");
            }

            if (String.IsNullOrEmpty(d["InvoiceIssuerType"]))
            {
                return ("InvoiceIssuerType");
            }
            if (d["InvoiceIssuerType"].Equals("TE"))
            {
                if (String.IsNullOrEmpty(d["TH_PersonTypeCode"]))
                {
                    return ("TH_PersonTypeCode");
                }
                if (d["TH_PersonTypeCode"].Equals("F"))
                {
                    if (String.IsNullOrEmpty(d["TH_Name"]))
                    {
                        return ("TH_Name");
                    }
                    if (String.IsNullOrEmpty(d["TH_FirstSurname"]))
                    {
                        return ("TH_FirstSurname");
                    }
                }
                else if (d["TH_PersonTypeCode"].Equals("J"))
                {
                    if (String.IsNullOrEmpty(d["TH_CorporateName"]))
                    {
                        return ("TH_CorporateName");
                    }
                }
                else
                {
                    return "Tipo Persona No definido";
                }
                if (String.IsNullOrEmpty(d["TH_ResidenceTypeCode"]))
                {
                    return ("TH_ResidenceTypeCode");
                }
                if (String.IsNullOrEmpty(d["SP_TaxIdentificationNumber"]))
                {
                    return ("TH_TaxIdentificationNumber");
                }
                if (String.IsNullOrEmpty(d["SP_ResidenceTypeCode"]))
                {
                    return ("TH_ResidenceTypeCode");
                }
                if (String.IsNullOrEmpty(d["SP_Address"]))
                {
                    return ("TH_Address");
                }
                if (String.IsNullOrEmpty(d["SP_CountryCode"]))
                {
                    return ("TH_CountryCode");
                }
                if (String.IsNullOrEmpty(d["TH_PostCode"]))
                {
                    return ("TH_PostCode");
                }
                if (String.IsNullOrEmpty(d["TH_Province"]))
                {
                    return ("TH_Province");
                }
                if (String.IsNullOrEmpty(d["TH_Town"]))
                {
                    return ("TH_Town");
                }
            }
            return "";
        }


        /// <summary>
        /// Método que devuelve una referencia al checkbox de Emitida
        /// </summary>
        /// <returns></returns>
        public RibbonCheckBox getCkBoxIssued()
        {
            return ckBoxIssued;
        }

        /// <summary>
        /// Método que devuelve una referencia al checkbox de Recibida
        /// </summary>
        /// <returns></returns>
        public RibbonCheckBox getCkBoxReceived()
        {
            return ckBoxReceived;
        }

        /// <summary>
        /// Método que devuelve una referencia al checkbox de Borrador
        /// </summary>
        /// <returns></returns>
        public RibbonCheckBox getCkBoxDraft()
        {
            return ckBoxDraft;
        }

        /// <summary>
        /// Método que cambia el valor de la variable de estado por el que recibe por parámetro.
        /// </summary>
        /// <param name="status">Parámetro de tipo string con el nuevo estado</param>
        public void setStatus(string status)
        {
            this.status = status;
        }

        /// <summary>
        ///Busca el ContentControl con el nombre especificado y devuelve el texto digitado
        /// </summary>
        /// <param name="tag">enumerado de tipo ControlList.tag que representa el nombre del contentControl</param>
        /// <returns>el Valor del contentControl con nombre = tag</returns>
        public string getControlValueByTag(ControlList.Tag tag)
        {
            string value = null;
            if (string.IsNullOrEmpty(tag.ToString("g")))
                return value;
            foreach (ContentControl item in Globals.ThisAddIn.Application.ActiveDocument.ContentControls)
            {
                if (!string.IsNullOrEmpty(item.Tag))
                {
                    if (item.Tag.Equals(tag.ToString("g")))
                    {
                        if (string.IsNullOrEmpty(item.Range.Text))
                            return value;
                        value = item.Range.Text.Trim();
                        break;
                    }
                }
            }

            return value;


        }


        private string controlValue(ControlList.Tag tag, string selectedItem)
        {
            string value = "";

            if (string.IsNullOrEmpty(tag.ToString("g")))
                return value;

            /*buscamos el combobox indicado*/
            foreach (ContentControl item in Globals.ThisAddIn.Application.ActiveDocument.ContentControls)
            {
                if (!string.IsNullOrEmpty(item.Tag))
                {
                    if (item.Tag.Equals(tag.ToString("g")))
                    {
                        /*si lo encontramos buscamos el valor correspondiente al texto seleccionado*/
                        foreach (ContentControlListEntry entry in item.DropdownListEntries)
                        {
                            if (!string.IsNullOrEmpty(item.Tag))
                            {
                                if (entry.Text.ToLower().Equals(selectedItem.ToLower()))
                                {
                                    value = entry.Value; break;
                                }
                            }

                        } break;
                    }
                }
            }
            return value;
        }



        #endregion







    }
}
